package com.controladores.controlvehicular.controlador;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

/**
 * Clase que gestiona la reproducción de sonido
 * 
 * @author Luis Soto <lsantoniosoto@gmail.com>
 * @author Mariuxi Salinas <mariuxidelcisne@gmail.com>
 * @version 1.0, 11/04/2014
 */
public class GestorDeSonido {

	private Context contexto;
	private SoundPool soundPool;
	private float velocidad = 1.0f;
	private float volumen = 1.0f;
	private float volumenIzquierdo = 1.0f;
	private float volumenDerecho = 1.0f;
	private float balance = 0.5f;

	/**
	 * Crea objeto de tipo SoundPool
	 * @param contexto contexto para el objeto
	 */
	public GestorDeSonido(Context contexto) {
		soundPool = new SoundPool(16, AudioManager.STREAM_MUSIC, 100);
		contexto = contexto;
	}

	/**
	 * Carga el sonido creado 
	 * @param idSonido id del sonido
	 * @return int listo o en espera
	 */
	public int cargar(int idSonido) {
		return soundPool.load(contexto, idSonido, 1);
	}

	/**
	 * Reproduce el sonido
	 * @param idSonido id del sonido
	 */
	public void reproducir(int idSonido) {
		soundPool.play(idSonido, volumenIzquierdo, volumenDerecho, 1, 0,
				velocidad);
	}


	/**
	 * Fijar volumen del sonido
	 * @param datoVolumen cantidad de volumen
	 */
	public void fijarVolumen(float datoVolumen) {
		volumen = datoVolumen;

		if (balance < 1.0f) {
			volumenIzquierdo = volumen;
			volumenDerecho = volumen * balance;
		} else {
			volumenDerecho = volumen;
			volumenIzquierdo = volumen * (2.0f - balance);
		}

	}

	/**
	 * Fija velocidad de sonido
	 * @param datoVelocidad cantidad de velocidad
	 */
	public void fijarVelocidad(float datoVelocidad) {
		velocidad = datoVelocidad;

		// Speed of zero is invalid
		if (velocidad < 0.01f)
			velocidad = 0.01f;

		// Speed has a maximum of 2.0
		if (velocidad > 2.0f)
			velocidad = 2.0f;
	}

	/**
	 * Fija un balance para el sonido
	 * @param datoValance cantidad de balance
	 */
	public void fijarBalance(float datoValance) {
		balance = datoValance;

		// Recalculate volume levels
		fijarVolumen(volumen);
	}

	// Free ALL the things!
	/**
	 * Inicia la reproducción
	 */
	public void iniciar() {
		soundPool.release();
	}

}